home *** CD-ROM | disk | FTP | other *** search
/ Clickx 96 / Clickx 96.iso / software / tools / tool / xbmc-10.1.exe / addons / script.module.pil / lib / PIL / ImagePalette.py < prev    next >
Encoding:
Python Source  |  2009-04-06  |  5.1 KB  |  185 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # image palette object
  6. #
  7. # History:
  8. # 1996-03-11 fl   Rewritten.
  9. # 1997-01-03 fl   Up and running.
  10. # 1997-08-23 fl   Added load hack
  11. # 2001-04-16 fl   Fixed randint shadow bug in random()
  12. #
  13. # Copyright (c) 1997-2001 by Secret Labs AB
  14. # Copyright (c) 1996-1997 by Fredrik Lundh
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18.  
  19. import array
  20. import Image, ImageColor
  21.  
  22. ##
  23. # Colour palette wrapper for palette mapped images.
  24.  
  25. class ImagePalette:
  26.     "Colour palette for palette mapped images"
  27.  
  28.     def __init__(self, mode = "RGB", palette = None):
  29.         self.mode = mode
  30.         self.rawmode = None # if set, palette contains raw data
  31.         self.palette = palette or range(256)*len(self.mode)
  32.         self.colors = {}
  33.         self.dirty = None
  34.         if len(self.mode)*256 != len(self.palette):
  35.             raise ValueError, "wrong palette size"
  36.  
  37.     def getdata(self):
  38.         # experimental: get palette contents in format suitable
  39.         # for the low-level im.putpalette primitive
  40.         if self.rawmode:
  41.             return self.rawmode, self.palette
  42.         return self.mode + ";L", self.tostring()
  43.  
  44.     def tostring(self):
  45.         # experimental: convert palette to string
  46.         if self.rawmode:
  47.             raise ValueError("palette contains raw palette data")
  48.         if Image.isStringType(self.palette):
  49.             return self.palette
  50.         return array.array("B", self.palette).tostring()
  51.  
  52.     def getcolor(self, color):
  53.         # experimental: given an rgb tuple, allocate palette entry
  54.         if self.rawmode:
  55.             raise ValueError("palette contains raw palette data")
  56.         if Image.isTupleType(color):
  57.             try:
  58.                 return self.colors[color]
  59.             except KeyError:
  60.                 # allocate new color slot
  61.                 if Image.isStringType(self.palette):
  62.                     self.palette = map(int, self.palette)
  63.                 index = len(self.colors)
  64.                 if index >= 256:
  65.                     raise ValueError("cannot allocate more than 256 colors")
  66.                 self.colors[color] = index
  67.                 self.palette[index] = color[0]
  68.                 self.palette[index+256] = color[1]
  69.                 self.palette[index+512] = color[2]
  70.                 self.dirty = 1
  71.                 return index
  72.         else:
  73.             raise ValueError("unknown color specifier: %r" % color)
  74.  
  75.     def save(self, fp):
  76.         # (experimental) save palette to text file
  77.         if self.rawmode:
  78.             raise ValueError("palette contains raw palette data")
  79.         if type(fp) == type(""):
  80.             fp = open(fp, "w")
  81.         fp.write("# Palette\n")
  82.         fp.write("# Mode: %s\n" % self.mode)
  83.         for i in range(256):
  84.             fp.write("%d" % i)
  85.             for j in range(i, len(self.palette), 256):
  86.                 fp.write(" %d" % self.palette[j])
  87.             fp.write("\n")
  88.         fp.close()
  89.  
  90. # --------------------------------------------------------------------
  91. # Internal
  92.  
  93. def raw(rawmode, data):
  94.     palette = ImagePalette()
  95.     palette.rawmode = rawmode
  96.     palette.palette = data
  97.     palette.dirty = 1
  98.     return palette
  99.  
  100. # --------------------------------------------------------------------
  101. # Factories
  102.  
  103. def _make_linear_lut(black, white):
  104.     lut = []
  105.     if black == 0:
  106.         for i in range(256):
  107.             lut.append(white*i/255)
  108.     else:
  109.         raise NotImplementedError # FIXME
  110.     return lut
  111.  
  112. def _make_gamma_lut(exp, mode="RGB"):
  113.     lut = []
  114.     for i in range(256):
  115.         lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5))
  116.     return lut
  117.  
  118. def new(mode, data):
  119.     return Image.core.new_palette(mode, data)
  120.  
  121. def negative(mode="RGB"):
  122.     palette = range(256)
  123.     palette.reverse()
  124.     return ImagePalette(mode, palette * len(mode))
  125.  
  126. def random(mode="RGB"):
  127.     from random import randint
  128.     palette = []
  129.     for i in range(256*len(mode)):
  130.         palette.append(randint(0, 255))
  131.     return ImagePalette(mode, palette)
  132.  
  133. def sepia(white="#fff0c0"):
  134.     r, g, b = ImageColor.getrgb(white)
  135.     r = _make_linear_lut(0, r)
  136.     g = _make_linear_lut(0, g)
  137.     b = _make_linear_lut(0, b)
  138.     return ImagePalette("RGB", r + g + b)
  139.  
  140. def wedge(mode="RGB"):
  141.     return ImagePalette(mode, range(256) * len(mode))
  142.  
  143. def load(filename):
  144.  
  145.     # FIXME: supports GIMP gradients only
  146.  
  147.     fp = open(filename, "rb")
  148.  
  149.     lut = None
  150.  
  151.     if not lut:
  152.         try:
  153.             import GimpPaletteFile
  154.             fp.seek(0)
  155.             p = GimpPaletteFile.GimpPaletteFile(fp)
  156.             lut = p.getpalette()
  157.         except (SyntaxError, ValueError):
  158.             pass
  159.  
  160.     if not lut:
  161.         try:
  162.             import GimpGradientFile
  163.             fp.seek(0)
  164.             p = GimpGradientFile.GimpGradientFile(fp)
  165.             lut = p.getpalette()
  166.         except (SyntaxError, ValueError):
  167.             pass
  168.  
  169.     if not lut:
  170.         try:
  171.             import PaletteFile
  172.             fp.seek(0)
  173.             p = PaletteFile.PaletteFile(fp)
  174.             lut = p.getpalette()
  175.         except (SyntaxError, ValueError):
  176.             pass
  177.  
  178.     if not lut:
  179.         raise IOError, "cannot load palette"
  180.  
  181.     return lut # data, rawmode
  182.  
  183.  
  184. # add some psuedocolour palettes as well
  185.